package com.katze.common.heart.server;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.apache.commons.lang3.StringUtils;

public class HeartBeatServerHandler extends SimpleChannelInboundHandler<String> {
    private String name;
    private String address;
    private String port;
    private final HeartBeatServer server;

    public HeartBeatServerHandler(HeartBeatServer server) {
        this.server = server;
    }

    /*
     * Channel 收到消息后触发
     *
     * 注：心跳包说白了就是一个某些地方特殊的数据包
     * 	  所以这里我们规定，如果消息内容是 "Heartbeat Packet"，那么它就是一个心跳包
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String message) throws Exception {
        // 如果消息内容是 Heartbeat Packet 则说明这是一个心跳包，我们返回 ok
        String[] values = message.split("@");
        switch (values[0]) {
            case "Active":
                String[] infos = values[1].split(":");
                name = infos[0];
                address = infos[1];
                port = infos[2];
                server.active(name, address, port);
                break;
            case "Heartbeat":
                ctx.channel().writeAndFlush("OK");
                break;
            default:
                String msg = server.channel(values);
                if (StringUtils.isNotBlank(msg)){
                    ctx.channel().writeAndFlush(msg);
                }
                break;
        }
    }

    /**
     * 用户事件触发
     * 当 IdleStateHandler 发现读超时后，会调用 fireUserEventTriggered() 去执行后一个 Handler 的 userEventTriggered 方法。
     * 所以，根据心跳检测状态去关闭连接的就写在这里！
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        ctx.channel().close();
        server.exit(name, address, port);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        ctx.channel().close();
        server.exit(name, address, port);
    }
}
